home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Oh!X 2000 Spring
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).7z
/
Oh!X 2000 Spring Special CD-ROM (Japan) (Part 1).bin
/
F2JW
/
trans
/
choice.cpp
next >
Wrap
C/C++ Source or Header
|
1999-08-28
|
3KB
|
142 lines
//
// F2j 出力に関する部分
// 出力先を標準出力から、outputBufferに変える
//
//
#include "stdafx.h"
#include <stdarg.h>
#include <string.h>
#include "f2j.h"
#include "MyProt.h"
#include "score.h"
#define OUTPUTBUFFER_SIZE 50000
int outputBufferPtr;
char outputBuffer[OUTPUTBUFFER_SIZE];
void
MyPrintfInit(void)
{
outputBufferPtr = 0;
outputBuffer[0] = '\0';
}
void
MyPrintf(char *fmt, ...)
{
va_list ap;
char *p, *sval;
int ival;
double dval;
va_start(ap, fmt);
for(p = fmt; *p; p++) {
if(outputBufferPtr > OUTPUTBUFFER_SIZE - 10) {
PrintInternalError("Internal Error <MyPrintf>\n");
exit(-1);
}
if(*p != '%') {
outputBuffer[outputBufferPtr++] = *p;
outputBuffer[outputBufferPtr] = '\0';
continue;
}
switch(*++p) {
case 'c':
ival = va_arg(ap, char);
sprintf(&outputBuffer[outputBufferPtr], "%c", ival);
break;
case 'd':
ival = va_arg(ap, int);
sprintf(&outputBuffer[outputBufferPtr], "%d", ival);
break;
case 'f':
dval = va_arg(ap, double);
sprintf(&outputBuffer[outputBufferPtr], "%f", dval);
break;
case 's':
sval = va_arg(ap, char *);
sprintf(&outputBuffer[outputBufferPtr], "%s", sval);
break;
default:
sprintf(&outputBuffer[outputBufferPtr], "%c", *p);
break;
}
// Advance the outputBufferPtr
while(outputBuffer[outputBufferPtr])
outputBufferPtr++;
outputBuffer[outputBufferPtr] = '\0';
}
va_end(ap);
}
void
MyPutchar(char c)
{
outputBuffer[outputBufferPtr++] = c;
outputBuffer[outputBufferPtr] = '\0';
}
void
MyPrintfFlush(int ptr)
{
JpnPrintf("%s", &outputBuffer[ptr]);
}
void
PrintOutBestJapanese(TOKEN *start, int maxJapanese)
{
int cntJapanese = 1;
TOKEN *p = start;
if(start == NULL) return;
while(1) {
TOKEN *best = SelectBestTree(start);
if(best == NULL) break;
if(AlreadyPrintedSameJapanese(start, best) == FALSE) {
MyPrintfFlush(best->value);
if(cntJapanese++ >= maxJapanese) break;
}
best->prtControl = PRT_CONTROL_DISPLAYED;
}
}
//
// 一番スコアの高い翻訳結果を選ぶ
//
TOKEN
*SelectBestTree(TOKEN *start)
{
TOKEN *bestTree = NULL;
int bestScore = -30000;
for(TOKEN *p = start; p; p = p->child) {
if(p->prtControl != PRT_CONTROL_ENABLE) continue;
p->scoreSelect = GetTreeScore(p->next, TRUE);
if(bestScore < p->scoreSelect) {
bestTree = p;
bestScore = p->scoreSelect;
}
}
return(bestTree);
}
int
AlreadyPrintedSameJapanese(TOKEN *start, TOKEN *best)
{
TOKEN *p;
for(p = start; p; p = p->child) {
if(p == best) continue;
if(p->prtControl == PRT_CONTROL_DISPLAYED
&& !strcmp(&outputBuffer[p->value], &outputBuffer[best->value]))
return(p->value);
}
return(0);
}